/**
*智能图标，能加载并显示一个封面，有默认封面的,加载成功之后默认的封面要动画消失
*!!注意这个要求bmd的尺寸始终都是一样的
*!!严重注意这个用的开始和结束的尺寸要始终一样大
*
*1130,这个加一条限制，这个东西如果是被大规模的用的话，会因为图片过到导致网络阻塞，消耗带宽
*	做一个延时即可，假设一个图片是多长时间需要加栽下来
*/
package kgame5.kgui.kcomp {
import kgame5.kgui.GP;
import kgame5.kmath.MathDG;
import kgame5.kutil.*;

import flash.display.*;
import flash.events.*;
import flash.geom.*;
import flash.net.*;
import flash.utils.*;

public class SmartIcon {
	//___________________Propetry________________________
	private var mc:Sprite;
		
			
	private var W:Number,H:Number;
	
	private var bmd_old:BitmapData;
	private var bmd_new:BitmapData;
	
	//--加载成功之后动画出现效果相关
	private var CC:int,RC:int;//格子的行、列数目
	private var Dur:int;//持续时间
	
	private var loader:Loader;
	
	//____________________Method____________________
	//直接在一个mc里创建smartIcon,这个里只有一个mc_pm,defaultCoverMCLinkID是用来显示图标地址的，图标可以是矢量的
	public static function CreateSmartIcon(mc:MovieClip,defaultCoverMCLinkID:String=null):SmartIcon{
		var mc_pm:MovieClip=mc.mc_pm;
		mc_pm.visible=false;
		var W:Number=mc_pm.width;
		var H:Number=mc_pm.height;
		
		
		var bmd:BitmapData=null;
		if(defaultCoverMCLinkID==null){//默认的要加载的作为封面的mc
			bmd=new BitmapData(W,H,false,0x00fff00);
		}else{
			bmd=Util.AttachMCAsBmd(defaultCoverMCLinkID);
		}
		var si:SmartIcon=new SmartIcon(W,H,bmd);
		mc.addChild(si.getDO());
		return si;
	}
	//注意defaultBmd的尺寸是很重要的，因为我认为这个尺寸和以后加载图片的尺寸是一样大小的
	//AnimCC,动画用的行的格子数目，AnimRC动画用的行的格子数目，AnimDur:动画需要多少真
	public function SmartIcon(p_W:Number,p_H:Number,defaultBmd:BitmapData,AnimCC:int=1,AnimRC:int=1,AnimDur:int=3){
		mc=new Sprite();
			
		W=p_W;
		H=p_H;
		
		//做mask的bmd
		bmd_old=defaultBmd;
		
		//用位图填充一个mc
		GP.fillRectWithBmd(mc.graphics,W,H,bmd_old);
		
		CC=AnimCC;
		RC=AnimRC;
		Dur=AnimDur;
		
		//--
		loader=new Loader();
		 loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
		 // loader.contentLoaderInfo.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
         loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
	}
	
	public function getDO():DisplayObject{
		return mc;
	}
	//注意要求是加载到的bmd要和原来的一样大
	public function LoadBmd(sUrlBmd:String){
		//--检测名字是否合法
		//T.p("SmartIcon.LoadBmd",sUrlBmd);
		var extendName:String=(sUrlBmd.substr(-4,4)).toUpperCase();//转换成大写
		//T.p("图片扩展名字:"+extendName);
		switch(extendName){
			case ".PNG":
			case ".GIF":
			case ".JPG":
			case "JPEG":
			//case ".SWF":
			break;
			default://如果是无效的则不加载直接返回
			T.p("无效的url"+extendName);
			return;
		}
		
		//--开始加载	
		try{
			loader.load(new URLRequest(sUrlBmd));
		}catch(err:Error){
			T.p("SamartIcon.LoadBmd加载失败");
		}
	}
	
	//////////////////////////
	private var delay_sBmdUrl:String;
	private var delay_timer:Timer;
	public function DelayLoadBmd(p_sBmdUrl:String,ms:int){//ms是毫秒
		//T.p("~~~~~~~~~~~~~~~~~~DelayLoadBmd",sec);
		delay_sBmdUrl=p_sBmdUrl;
		delay_timer=new Timer(ms);//停留多少秒
		delay_timer.addEventListener(TimerEvent.TIMER, delay_th);
		delay_timer.start();
	}
	//delay load图片，因为如果大规模数据过来的时候会导致网络阻塞
	private function delay_th(e:TimerEvent){
		//T.p("~~~~~~~~~~~~~delay_th定时时间到",delay_sBmdUrl);
		try{
			delay_timer.stop();
			this.LoadBmd(delay_sBmdUrl);
		}catch(err:Error){
			//try catch是为了防止这个已经被干掉了然后再去加载
		}
	}
	//////////////////////////
	
	
	
	
	
	public function completeHandler(e:Event){
		 var l:Loader=LoaderInfo(e.target).loader;
         var bmd:BitmapData=Bitmap(l.content).bitmapData;
       // T.p(" smartIcon家在图片到了:",bmd.width,bmd.height,W,H);
         SetBmd(bmd);
	}
	 private function ioErrorHandler(event:IOErrorEvent):void {
           T.p("smartIcon.ioErrorHandler: " + event);
           try{
           	loader.close();
           }catch(err:Error){
           }
      }
	public function SetBmd(p_bmd:BitmapData){
		try{
			bmd_new.dispose();
		}catch(e:Error){
		}
		bmd_new=p_bmd;
		
		//用位图填充一个mc
		GP.fillRectWithBmd(mc.graphics,W,H,bmd_old);
		
		idx=0;
		aCellIdx=MathDG.GenRandArray(CC*RC-1);
		
		mc.addEventListener(Event.ENTER_FRAME, efh);
		
		//
		//Tween2DX.StartBrightnessMove(mc, 1, 0, 4);
	}
	private var idx:int=0;
	private var aCellIdx:Array;
	private function efh(e:Event){
		for(var i:int=0;i<CC*RC/Dur;i++){
			drawACell();
		}
	}
	private function drawACell(){
		if(idx==CC*RC){
			return;
		}
		
		var realIdx:int=aCellIdx[idx];
		
		var CellW:Number=bmd_new.width/CC;
		var CellH:Number=bmd_new.height/RC;
		var r:int=realIdx/RC;
		var c:int=realIdx%CC;
		
		
		bmd_old.copyPixels(bmd_new, new Rectangle(c*CellW,r*CellH,CellW+1,CellH+1), new Point(c*CellW,r*CellH));
		
		idx++;
		if(idx==CC*RC){
			bmd_new.dispose();//!!!这个非常重要，用完了的要释放掉资源 
			mc.removeEventListener(Event.ENTER_FRAME, efh);
		}
	}
	
	////////////////关于标签加载的顺序控制////////////////
	//这个为了防止很多的smartIcon同时加栽而导致的网络阻塞,
	//解决办法是需要的时候为每个设置一个顺序号，每个按顺序号来自己做一个定时加载
	//
	private static var iOrderIdx:int=0;
	private static var bUseOrder:Boolean=false;
	private static var iJump:int=5;//默认一批加栽3个
	private static var tick:int=0;
	//启动需要管理器
	public static function StartOrderManager(p_iJump:int=3){
		iOrderIdx=0;
		bUseOrder=true;
		iJump=p_iJump;
		tick=0;
	}
	//关闭序号管理器
	public static  function ClearOrderManager(){
		iOrderIdx=0;
		bUseOrder=false;
		tick=0;
	}
	//取得一个序号
	public static function GetNextOrder():int{
		//T.p("SmartIcon.GetNextOrder");
		var oid:int=0;
		if(bUseOrder==false){
			oid=0;
		}else{
			tick++;
			if(tick>=iJump){
				tick=0;
				oid=iOrderIdx++;
			}
		}
		//T.p("返回的顺序号",oid);
		return oid;
	}
}//end of class
}
